"""
同步分析接口客户端调用示例

本文件演示如何调用新加入的同步分析接口，包括：
1. Python requests库调用示例
2. JavaScript fetch API调用示例
3. 错误处理和响应解析
4. 批量数据发送示例

接口功能：
- 上传脑波数据并同步返回分析结果
- 支持实时分析（数据<60秒）和YASA分析（数据>=60秒）
- 返回睡眠阶段、置信度和频域功率比例

使用方法：
1. 准备符合格式的脑波数据
2. 发送POST请求到 /api/tablet/brainwave/sync
3. 解析返回的分析结果

原理：
接口会根据数据量自动选择分析方式，同步等待分析完成后返回结果，
无需像异步接口那样轮询查询分析状态。
"""

import requests
import json
import time
import random
from datetime import datetime
from typing import List, Dict, Any

# 服务器配置
BASE_URL = "http://localhost:8000"
SYNC_ANALYSIS_URL = f"{BASE_URL}/api/tablet/brainwave/sync"

def generate_mock_brainwave_data(session_id: str, room_id: str) -> Dict[str, Any]:
    """
    生成模拟脑波数据
    
    Args:
        session_id: 会话ID
        room_id: 房间ID
        
    Returns:
        符合接口要求的脑波数据字典
    """
    # 生成512个原始EEG数据点（模拟512Hz采样率）
    raw_value = [random.randint(-2048, 2047) for _ in range(512)]
    
    # 生成8个频段功率数据
    frequency_powers = {
        "delta": random.randint(50, 300),
        "theta": random.randint(80, 400),
        "low_alpha": random.randint(100, 500),
        "high_alpha": random.randint(90, 450),
        "low_beta": random.randint(60, 350),
        "high_beta": random.randint(40, 250),
        "low_gamma": random.randint(20, 150),
        "mid_gamma": random.randint(10, 100)
    }
    
    return {
        "session_id": session_id,
        "room_id": room_id,
        "timestamp": int(datetime.now().timestamp() * 1000),
        "raw_value": raw_value,
        **frequency_powers,
        "attention": random.randint(0, 100),
        "meditation": random.randint(0, 100),
        "poor_signal": random.randint(0, 50),  # 好信号质量
        "blink_strength": random.randint(0, 255)
    }

def call_sync_analysis_api(data: Dict[str, Any]) -> Dict[str, Any]:
    """
    调用同步分析接口
    
    Args:
        data: 脑波数据字典
        
    Returns:
        API响应结果
    """
    try:
        print(f"发送同步分析请求: session_id={data['session_id']}")
        
        # 发送POST请求
        response = requests.post(
            SYNC_ANALYSIS_URL,
            json=data,
            headers={"Content-Type": "application/json"},
            timeout=30  # 同步接口可能需要较长时间
        )
        
        # 检查响应状态
        if response.status_code == 200:
            result = response.json()
            print(f"✅ 同步分析成功: {result.get('message', '分析完成')}")
            return result
        else:
            print(f"❌ 请求失败: {response.status_code} - {response.text}")
            return {"success": False, "error": f"HTTP {response.status_code}"}
            
    except requests.exceptions.Timeout:
        print("❌ 请求超时")
        return {"success": False, "error": "请求超时"}
    except requests.exceptions.ConnectionError:
        print("❌ 连接失败")
        return {"success": False, "error": "连接失败"}
    except Exception as e:
        print(f"❌ 请求异常: {str(e)}")
        return {"success": False, "error": str(e)}

def parse_analysis_result(result: Dict[str, Any]) -> None:
    """
    解析分析结果
    
    Args:
        result: API返回的结果字典
    """
    if not result.get("success"):
        print(f"分析失败: {result.get('message', '未知错误')}")
        return
    
    print("\n=== 分析结果 ===")
    print(f"会话ID: {result.get('session_id')}")
    print(f"数据点数: {result.get('received_data_points')}")
    print(f"缓冲区大小: {result.get('buffer_size')}")
    print(f"分析耗时: {result.get('analysis_duration_ms')}ms")
    
    # 睡眠阶段分析
    sleep_stage = result.get('sleep_stage')
    confidence = result.get('confidence')
    if sleep_stage:
        stage_names = {
            'wake': '清醒',
            'n1': '浅睡眠N1',
            'n2': '浅睡眠N2', 
            'n3': '深睡眠N3',
            'rem': 'REM睡眠'
        }
        print(f"睡眠阶段: {stage_names.get(sleep_stage, sleep_stage)}")
        print(f"置信度: {confidence:.2%}" if confidence else "置信度: 未知")
    
    # 频域功率比例
    frequency_bands = result.get('frequency_bands')
    if frequency_bands:
        print("\n频域功率比例:")
        for band, ratio in frequency_bands.items():
            print(f"  {band}: {ratio:.2%}")

def batch_send_example():
    """
    批量发送示例 - 模拟连续数据流
    """
    session_id = f"test_session_{int(time.time())}"
    room_id = "test_room_001"
    
    print(f"开始批量发送测试: session_id={session_id}")
    
    for i in range(5):  # 发送5次数据
        print(f"\n--- 第 {i+1} 次发送 ---")
        
        # 生成模拟数据
        data = generate_mock_brainwave_data(session_id, room_id)
        
        # 调用接口
        result = call_sync_analysis_api(data)
        
        # 解析结果
        parse_analysis_result(result)
        
        # 间隔1秒（模拟每秒一次的数据发送）
        if i < 4:  # 最后一次不需要等待
            time.sleep(1)

def single_request_example():
    """
    单次请求示例
    """
    session_id = f"single_test_{int(time.time())}"
    room_id = "test_room_single"
    
    print(f"单次请求测试: session_id={session_id}")
    
    # 生成模拟数据
    data = generate_mock_brainwave_data(session_id, room_id)
    
    # 调用接口
    result = call_sync_analysis_api(data)
    
    # 解析结果
    parse_analysis_result(result)

if __name__ == "__main__":
    print("=== 同步分析接口调用示例 ===\n")
    
    # 选择测试类型
    test_type = input("选择测试类型 (1: 单次请求, 2: 批量发送): ").strip()
    
    if test_type == "1":
        single_request_example()
    elif test_type == "2":
        batch_send_example()
    else:
        print("无效选择，执行单次请求测试")
        single_request_example()